Skip to content

Refactor OMNIBUSF4 targets into separate directories#43

Draft
sensei-hacker wants to merge 31 commits intomaintenance-9.xfrom
refactor/split-omnibusf4-targets
Draft

Refactor OMNIBUSF4 targets into separate directories#43
sensei-hacker wants to merge 31 commits intomaintenance-9.xfrom
refactor/split-omnibusf4-targets

Conversation

@sensei-hacker
Copy link
Owner

@sensei-hacker sensei-hacker commented Dec 22, 2025

User description

Summary

Split the OMNIBUSF4 target directory into three separate directories to reduce complexity and improve maintainability:

  • DYSF4: DYS variants (DYSF4PRO, DYSF4PROV2)
  • OMNIBUSF4: Original OMNIBUSF4 target
  • OMNIBUSF4PRO: PRO and V3 variants (OMNIBUSF4PRO, OMNIBUSF4V3, V3_S6_SS, V3_S5S6_SS, V3_S5_S6_2SS, V3_ICM)

Changes

  • Created src/main/target/DYSF4/ with target.h, target.c, CMakeLists.txt
  • Created src/main/target/OMNIBUSF4PRO/ with target.h, target.c, CMakeLists.txt
  • Modified src/main/target/OMNIBUSF4/ files to remove targets moved to other directories
  • Each directory now contains only the conditional compilation blocks relevant to its specific targets

Verification

All 9 targets verified to produce identical preprocessed output before and after split using gcc -E:

  • DYSF4PRO, DYSF4PROV2
  • OMNIBUSF4
  • OMNIBUSF4PRO, OMNIBUSF4V3, OMNIBUSF4V3_S6_SS, OMNIBUSF4V3_S5S6_SS, OMNIBUSF4V3_S5_S6_2SS, OMNIBUSF4V3_ICM

All 9 targets build successfully with no errors.

Benefits

  • Simplifies maintenance by separating hardware variants with different pin configurations
  • Reduces cognitive load when working on specific target families
  • Makes conditional compilation structure clearer
  • No functional changes - all targets produce identical code

PR Type

Enhancement, Bug fix


Description

This description is generated by an AI tool. It may have inaccuracies

  • Refactor OMNIBUSF4 target into three separate directories (DYSF4, OMNIBUSF4, OMNIBUSF4PRO) to reduce complexity and improve maintainability

  • Fix critical cppcheck bugs: integer overflow in fc/config.h and buffer overrun in sensors/temperature.c

  • Fix CRSF buffer overflow vulnerability and dashboard sizeof bug in io/dashboard.c

  • Add comprehensive Power and Current Limiting documentation to Battery.md with configuration examples

  • Update JavaScript programming documentation to use namespaced API (inav.flight, inav.override, inav.events)

  • Improve SD card handling with timeout protection and DMA buffer alignment for STM32H7

  • Add MSC USB descriptor support and improve power limiter initialization logic


Diagram Walkthrough

flowchart LR
  A["OMNIBUSF4 Target"] -->|Split| B["DYSF4 Directory"]
  A -->|Split| C["OMNIBUSF4 Directory"]
  A -->|Split| D["OMNIBUSF4PRO Directory"]
  E["Critical Bugs"] -->|Fix| F["Integer Overflow"]
  E -->|Fix| G["Buffer Overrun"]
  E -->|Fix| H["CRSF Overflow"]
  I["Documentation"] -->|Add| J["Power Limiting Guide"]
  I -->|Update| K["JavaScript API Examples"]
  L["SD Card Driver"] -->|Improve| M["Timeout Protection"]
  L -->|Improve| N["DMA Alignment"]
Loading

File Walkthrough

Relevant files
Enhancement
7 files
target.h
Remove conditional compilation for split targets                 
+1/-103 
usbd_storage_sd_spi.c
Add timeout protection and DMA buffer alignment                   
+100/-6 
sdcard_sdio.c
Add retry logic and operation timeout handling                     
+29/-3   
sdcard_impl.h
Add operation retry counter definition                                     
+2/-0     
usb_msc_h7xx.c
Use MSC descriptor for standalone MSC mode                             
+3/-1     
usbd_desc.c
Add MSC-specific USB descriptor functions                               
+91/-0   
usbd_desc.h
Export MSC descriptor structure                                                   
+4/-0     
New target
6 files
target.h
New target header for OMNIBUSF4PRO variants                           
+260/-0 
target.c
New timer hardware configuration for PRO variants               
+67/-0   
CMakeLists.txt
Build configuration for OMNIBUSF4PRO targets                         
+9/-0     
target.h
New target header for DYS variants                                             
+169/-0 
target.c
New timer hardware configuration for DYS variants               
+47/-0   
CMakeLists.txt
Build configuration for DYSF4 targets                                       
+2/-0     
Bugfix
5 files
config.h
Fix signed integer overflow in feature flags                         
+1/-1     
temperature.c
Fix buffer overrun in memset call                                               
+1/-1     
dashboard.c
Fix sizeof bug with pointer to array conversion                   
+2/-2     
crsf.c
Add bounds check for CRSF frame length                                     
+5/-0     
power_limits.c
Fix burst limit validation logic for disabled state           
+7/-2     
Documentation
12 files
Battery.md
Add comprehensive power and current limiting documentation
+149/-0 
JAVASCRIPT_PROGRAMMING_GUIDE.md
Update examples to use namespaced inav API                             
+133/-59
TIMER_WHENCHANGED_EXAMPLES.md
Update timer and whenChanged examples with inav namespace
+76/-71 
TIMER_WHENCHANGED_IMPLEMENTATION.md
Update implementation examples with inav namespace             
+21/-16 
OPERATIONS_REFERENCE.md
Update operation examples with inav namespace                       
+19/-16 
TESTING_GUIDE.md
Update test examples with inav namespace                                 
+23/-16 
api_maintenance_guide.md
Update API maintenance guide with inav namespace                 
+20/-6   
api_definitions_summary.md
Update API definitions with inav namespace                             
+5/-1     
GENERATE_CONSTANTS_README.md
Update constant generation guide with inav namespace         
+5/-2     
implementation_summary.md
Update implementation summary with inav namespace               
+16/-15 
index.md
Update main index with inav namespace and features             
+9/-6     
Development.md
Update branching workflow and maintenance branch guidance
+103/-6 
Additional files
2 files
CMakeLists.txt +0/-10   
target.c +0/-19   

Adds minPowerIndex (byte 12) to MSP_VTX_CONFIG response to indicate
the minimum valid power index for the VTX device.

- MSP VTX: minPowerIndex = 0 (supports power off at index 0)
- SmartAudio/Tramp: minPowerIndex = 1 (power off not supported)

This allows configurator to correctly display all available power
levels without hardcoding device-specific logic.

Backward compatible: old configurators will ignore the extra byte.

Related: iNavFlight/inav-configurator#2486

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@qodo-code-review
Copy link

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
Buffer overflow risk

Description: The new USB MSC read/write loops compute offsets as buf + (512 * i) and perform fixed-size
memcpy(..., 512) without any explicit validation that blk_len is bounded such that
(blk_len * 512) fits within the provided buf, which could lead to an integer overflow and
subsequent out-of-bounds read/write if a malformed or unexpected MSC request results in an
oversized blk_len.
usbd_storage_sd_spi.c [232-336]

Referred Code
	UNUSED(lun);
	LED1_ON;
	for (int i = 0; i < blk_len; i++) {
		uint32_t timeout;
#if defined(STM32H7) && defined(USE_SDCARD_SDIO)
		// H7 SDIO DMA requires 32-byte aligned buffers
		// USB MSC buffer may not be aligned, so use intermediate buffer
		timeout = 0;
		while (sdcard_readBlock(blk_addr + i, alignedBuffer, NULL, 0) == 0) {
			sdcard_poll();
			if (++timeout > 5000) {
				LED1_OFF;
				return -1;  // Timeout waiting for read to start
			}
			delay(1);
		}
		timeout = 0;
		while (sdcard_poll() == 0) {
			if (++timeout > 5000) {
				LED1_OFF;
				return -1;  // Timeout waiting for read to complete


 ... (clipped 84 lines)
Ticket Compliance
🎫 No ticket provided
  • Create ticket/issue
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

@qodo-code-review
Copy link

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
Handle SD card initialization failure correctly

Modify the STORAGE_Init function to correctly handle SD card initialization
failures by explicitly checking for a success status from sdcard_poll() instead
of any non-zero value.

src/main/msc/usbd_storage_sd_spi.c [150-169]

 static int8_t STORAGE_Init (uint8_t lun)
 {
 	UNUSED(lun);
 	LED0_OFF;
 
 	// Only initialize if not already initialized (e.g., by blackbox)
 	if (!sdcard_isInitialized()) {
 		sdcard_init();
 	}
 
 	// Poll with timeout to avoid infinite loop
 	uint32_t timeout = 0;
-	while (sdcard_poll() == 0 && timeout < 1000) {
+    sdcardOperationStatus_e poll_status;
+	while ((poll_status = sdcard_poll()) == SDCARD_OPERATION_IN_PROGRESS && timeout < 1000) {
 		timeout++;
 		delay(1);
 	}
 
 	LED0_ON;
-	return (timeout < 1000) ? 0 : -1;
+	return (poll_status == SDCARD_OPERATION_SUCCESS) ? 0 : -1;
 }

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies a bug where the function could incorrectly return success on an SD card initialization failure, preventing a potential source of errors in downstream operations.

Medium
Return false on read failure

Add a return false; statement after handling a read failure at maximum retries
to ensure the function correctly reports the failure.

src/main/drivers/sdcard/sdcard_sdio.c [575-578]

 sdcardSdio_reset();
 if (sdcard.pendingOperation.callback) {
     sdcard.pendingOperation.callback(SDCARD_BLOCK_OPERATION_READ, sdcard.pendingOperation.blockIndex, NULL, sdcard.pendingOperation.callbackData);
 }
+return false;

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 8

__

Why: The suggestion fixes a bug where the function would incorrectly return true after a read failure with maximum retries, preventing potential data corruption or inconsistent state.

Medium
Fix incomplete power limit validation logic

Improve power limit validation by ensuring that if a continuous limit is set,
the burst limit is also set to at least the same value, even if the burst limit
was initially disabled (zero).

src/main/flight/power_limits.c [75-97]

 void powerLimiterInit(void) {
     // Only enforce burst >= continuous if burst is enabled (non-zero)
     // A value of 0 means "disabled/unlimited", not "zero amps allowed"
-    if (currentBatteryProfile->powerLimits.burstCurrent > 0 &&
-        currentBatteryProfile->powerLimits.burstCurrent < currentBatteryProfile->powerLimits.continuousCurrent) {
+    if ((currentBatteryProfile->powerLimits.burstCurrent > 0 &&
+        currentBatteryProfile->powerLimits.burstCurrent < currentBatteryProfile->powerLimits.continuousCurrent) ||
+        (currentBatteryProfile->powerLimits.burstCurrent == 0 && currentBatteryProfile->powerLimits.continuousCurrent > 0)) {
         currentBatteryProfileMutable->powerLimits.burstCurrent = currentBatteryProfile->powerLimits.continuousCurrent;
     }
 ...
 #ifdef USE_ADC
     // Only enforce burst >= continuous if burst is enabled (non-zero)
-    if (currentBatteryProfile->powerLimits.burstPower > 0 &&
-        currentBatteryProfile->powerLimits.burstPower < currentBatteryProfile->powerLimits.continuousPower) {
+    if ((currentBatteryProfile->powerLimits.burstPower > 0 &&
+        currentBatteryProfile->powerLimits.burstPower < currentBatteryProfile->powerLimits.continuousPower) ||
+        (currentBatteryProfile->powerLimits.burstPower == 0 && currentBatteryProfile->powerLimits.continuousPower > 0)) {
         currentBatteryProfileMutable->powerLimits.burstPower = currentBatteryProfile->powerLimits.continuousPower;
     }
 #endif
 }

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a potential configuration issue where a disabled burst limit with an enabled continuous limit might lead to unexpected behavior, improving the robustness of the power limiting feature.

Medium
Fix potential typo in target name

Verify a potential typo in the CMake target name OMNIBUSF4V3_S5S6_SS, which
seems to be missing an underscore, unlike similar target names.

src/main/target/OMNIBUSF4PRO/CMakeLists.txt [3-5]

 target_stm32f405xg(OMNIBUSF4V3_S5_S6_2SS)
-target_stm32f405xg(OMNIBUSF4V3_S5S6_SS)
+target_stm32f405xg(OMNIBUSF4V3_S5_S6_SS)
 target_stm32f405xg(OMNIBUSF4V3_S6_SS)
  • Apply / Chat
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a naming inconsistency in a new CMakeLists.txt file which could be a typo, and appropriately asks for verification, which is a valid and helpful review comment.

Medium
Handle SD card write failures promptly

Update the STORAGE_Write function to exit the write-start loop immediately if
sdcard_writeBlock returns a failure status, instead of retrying until a timeout.

src/main/msc/usbd_storage_sd_spi.c [319-326]

-		while (sdcard_writeBlock(blk_addr + i, buf + (i * 512), NULL, 0) != SDCARD_OPERATION_IN_PROGRESS) {
+		sdcardOperationStatus_e write_status;
+		while ((write_status = sdcard_writeBlock(blk_addr + i, buf + (i * 512), NULL, 0)) == SDCARD_OPERATION_BUSY) {
 			sdcard_poll();
 			if (++timeout > 5000) {
 				LED1_OFF;
 				return -1;  // Timeout waiting for write to start
 			}
 			delay(1);
 		}
 
+		if (write_status != SDCARD_OPERATION_IN_PROGRESS) {
+			LED1_OFF;
+			return -1; // Write operation failed to start
+		}
+
  • Apply / Chat
Suggestion importance[1-10]: 6

__

Why: The suggestion improves error handling responsiveness by exiting the write loop immediately on failure, rather than waiting for a timeout, which is a good practice for robustness.

Low
General
Reset frame-done flag on discard

When discarding an oversized CRSF frame, also reset the crsfFrameDone flag to
false to prevent processing a stale frame.

src/main/rx/crsf.c [163-166]

 if (fullFrameLength > CRSF_FRAME_SIZE_MAX) {
     crsfFramePosition = 0;
+    crsfFrameDone = false;
     return;
 }
  • Apply / Chat
Suggestion importance[1-10]: 7

__

Why: The suggestion improves the robustness of the CRSF frame processing by ensuring the crsfFrameDone flag is reset when an oversized frame is discarded, preventing a potential stale state.

Medium
  • More

@sensei-hacker sensei-hacker marked this pull request as draft December 22, 2025 03:12
Split OMNIBUSF4 mega-target into 4 directories to improve maintainability:
- DYSF4: DYSF4PRO, DYSF4PROV2
- OMNIBUSF4: Base OMNIBUSF4 variant only
- OMNIBUSF4PRO: OMNIBUSF4PRO, OMNIBUSF4V3, OMNIBUSF4V3_ICM
- OMNIBUSF4V3_SS: Softserial variants (S6_SS, S5S6_SS, S5_S6_2SS)

Each directory now contains only the code relevant to its variants,
with irrelevant preprocessor conditionals removed.

Changes:
- Reduced DYSF4/target.h from 271 to 169 lines (37% reduction)
- Reduced preprocessor conditionals from 18 to 4 in DYSF4 files
- All 11 targets build successfully and produce identical binaries
@sensei-hacker sensei-hacker force-pushed the refactor/split-omnibusf4-targets branch from e61568d to cebc906 Compare December 22, 2025 07:51
sensei-hacker and others added 23 commits December 22, 2025 02:15
Remove preprocessor conditionals that can never be true in split directories:
- OMNIBUSF4PRO: Remove checks for _S6_SS variants (in different directory)
- OMNIBUSF4V3_SS: Remove checks for OMNIBUSF4PRO/V3 (in different directory)
- Remove OMNIBUSF4PRO_LEDSTRIPM5 references (target no longer exists)

Update comments to accurately describe what targets each directory contains.

All affected targets build successfully.
The OMNIBUSF4 directory now only contains the base OMNIBUSF4 target.
All other variants (OMNIBUSF4PRO, OMNIBUSF4V3, DYSF4, etc.) are in
separate directories.

Used unifdef to remove all conditionals for non-OMNIBUSF4 targets:
- Removed checks for OMNIBUSF4PRO, OMNIBUSF4V3, DYSF4PRO, DYSF4PROV2
- Removed checks for softserial variants (_S6_SS, etc.)
- Removed LEDSTRIPM5 references

Results:
- target.h: 280 → 147 lines (47% reduction, 133 lines removed)
- target.c: cleaned (7 conditionals removed)
- All conditionals removed: 0 remaining in both files
- OMNIBUSF4 target builds successfully

The OMNIBUSF4 directory now contains only the code specific to the
base OMNIBUSF4 variant with no dead branches.
1. Added alias for OMNIBUSF4V3_ICM → OMNIBUSF4V3 in OMNIBUSF4PRO/target.h
   This fixes a critical bug where OMNIBUSF4V3_ICM would get wrong configuration:
   - Wrong IMU alignment (CW180 instead of CW270)
   - Missing MPU6500/BMI270 support
   - Wrong barometer (I2C-only instead of SPI BMP280)
   - Missing UART inverter support
   - Wrong SPI3_NSS_PIN (PB3 instead of PA15)
   - Wrong blackbox (SPI flash instead of SD card)
   - Wrong timer configuration

2. Removed dead #else clauses after OMNIBUS split:
   - DYSF4/target.h: Removed unreachable fallback cases
   - OMNIBUSF4PRO/target.h: All #else branches now dead after alias fix
   - OMNIBUSF4V3_SS/target.h: Removed unreachable softserial fallback

All affected targets verified to build successfully.
- DYSF4/target.h: Removed ICM20608 comment (no ICM support in this directory)
- OMNIBUSF4/target.h: Removed ICM20608 comment (no ICM support in this directory)
- OMNIBUSF4/target.h: Removed obsolete relationship comments from consolidated file

ICM20608 support only exists in OMNIBUSF4PRO and OMNIBUSF4V3_SS directories.
The #else branch at lines 44-46 was unreachable after adding
OMNIBUSF4V3_ICM aliasing. All three targets (OMNIBUSF4PRO,
OMNIBUSF4V3, OMNIBUSF4V3_ICM) always use TIM4/PB9, never TIM12/PB15.
1. Removed outdated 'pad labelled CH5/CH6 on OMNIBUSF4PRO' comments from:
   - OMNIBUSF4/target.h and target.c (wrong target)
   - DYSF4/target.h and target.c (wrong target)
   - OMNIBUSF4V3_SS/target.c (wrong target)

   These comments are only accurate in the OMNIBUSF4PRO directory where
   PC8/PC9 really are labelled CH5/CH6 on the physical board.

2. Removed redundant conditional from OMNIBUSF4PRO/target.c:
   #if (defined(OMNIBUSF4PRO) || defined(OMNIBUSF4V3))
   This is always true since all 3 targets in this directory
   (OMNIBUSF4PRO, OMNIBUSF4V3, OMNIBUSF4V3_ICM) have one of these defined.
Remove orphaned indentation from preprocessor defines that were
previously inside conditional blocks but are now at top level after
the target split.

Files changed:
- OMNIBUSF4/target.h: Fixed 2-space and 4-space orphaned indents
- DYSF4/target.h: Fixed 2-space orphaned indents
- OMNIBUSF4V3_SS/target.h: Fixed extensive 2-space orphaned indents
- OMNIBUSF4PRO/target.h: Fixed 4-space orphaned indent on ADC_CHANNEL_3_PIN

Valid indentation inside active #if blocks was preserved.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The updateArmingStatus() function performs 20+ safety checks (GPS fix,
battery voltage, sensor health, LED updates, etc.) that don't need
millisecond-level updates. Previously called every PID loop iteration
(2000 Hz), now rate-limited to 200 Hz.

Testing on AT32F435 hardware showed 10-13% PID loop performance
improvement with no functional impact. 200 Hz (5ms response time)
is well within human reaction time (~200ms) and exceeds the update
rate of the sensors being checked (GPS: 5-10 Hz, battery: slow).
The AGL velocity update was incorrectly using squared acceleration
weight factor (sq(accWeightFactor)) while the altitude update uses
linear weight. This creates physical inconsistency where position
and velocity respond differently to the same acceleration.

With accWeightFactor=0.5 (moderate confidence):
- Altitude receives 50% of acceleration (correct)
- Velocity was receiving 25% of acceleration (wrong - squared)

This fix removes sq() from the velocity update to match the altitude
update, making both integrations physically consistent with standard
kinematic equations.

May fix iNavFlight#10314
May be related to iNavFlight#10567
Comments incorrectly stated 0.3 when code uses 0.5f.
Updated comments to match actual implementation.
These entries are not relevant to this PR and should not be included
in upstream changes.
Prepare for 9.0.1 patch release.
…ersion-9.0.1

Bump firmware version to 9.0.1
…ty-weight-squared

Fix AGL velocity estimation using squared acceleration weight factor
The periodic MON-VER and MON-GNSS polls in the main GPS loop waited on
_ack_state for ACK/NAK. MON-class messages never produce ACK/NAK (only
CFG-class messages do), so ptWaitTimeout always hit the full 500ms
timeout. This blocked gpsProcessNewSolutionData from being called,
causing a data processing stall every GPS_CAPA_INTERVAL (5s).

Wait on actual response data instead, matching the pattern already used
in the initialization code: hwVersion change for MON-VER, and
lastCapaUpdMs timestamp for MON-GNSS.
The receiver thread parses MON-VER/MON-GNSS responses asynchronously.
Nothing between the polls and the next loop iteration depends on the
updated data, so the waits just block position fix processing for no
benefit. The 5-second GPS_CAPA_INTERVAL already prevents re-polling
too frequently.
The default IMU_ICM42605_ALIGN was set to CW180_DEG, which is 180
degrees off from the physical direction arrow on the RadioMaster
NEXUS-X board. Users had to manually apply YAW-180 correction in
the configurator to get correct orientation.

Change alignment to CW0_DEG to match the board silkscreen.

Fixes iNavFlight#11325
…ateArmingStatus

Reduce CPU overhead by rate-limiting updateArmingStatus() to 200 Hz
…oll-stall

Fix GPS capability poll blocking for 500ms every 5 seconds
…_corr_refactor

Position estimator sensor correction refactor
…wer-min

MSP: Add minimum power index to MSP_VTX_CONFIG
…5-nexusx-imu-orientation

Fix NEXUSX default IMU orientation
The upstream added OMNIBUSF4V3_ICM support to the monolithic
OMNIBUSF4/target.h. This PR moves OMNIBUSF4V3_ICM to the new
OMNIBUSF4PRO/ directory alongside V3.

Resolution:
- OMNIBUSF4/target.h: keep PR version (base target only, no PRO/V3/ICM)
- OMNIBUSF4/CMakeLists.txt: keep PR version (only OMNIBUSF4 here)
- OMNIBUSF4PRO/target.h: add ICM42605 support for OMNIBUSF4V3_ICM,
  which was present in upstream but missing from the split target
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants